package com.alibaba.cloud.utils;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import com.alibaba.cloud.encry.Base64Util;
/**
 * The Class HmacUtil.
 *
 * @ClassName: HMAC
 * @Description: HMAC HMAC(Hash Message Authentication
 * Code，散列消息鉴别码，基于密钥的Hash算法的认证协议。
 * 消息鉴别码实现鉴别的原理是，用公开函数和密钥产生一个固定长度的值作为认证标识，用这个标识鉴别消息的完整性。
 * 使用一个密钥生成一个固定大小的小数据块， 即MAC，并将其加入到消息中，然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。
 * @author: zhb zhb1316783262@163.com
 * @date: 2018年3月13日 上午11:46:18
 */
public class HmacUtil {
    /** The Constant KEY_MAC. */
    public static final String KEY_MAC = "HmacMD";

    /**
     * Inits the mac key.
     *
     * @return the string
     * @throws Exception the exception
     * @Description: 初始化HMAC密钥
     * @author: zhb zhb1316783262@163.com
     * @date: 2018年3月13日 上午11:47:22
     */
    public static String initMacKey() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
        SecretKey secretKey = keyGenerator.generateKey();
        return Base64Util.encode(new String(secretKey.getEncoded()));
    }

    /**
     * Encrypt HMAC.
     *
     * @param data the data
     * @param key the key
     * @return the string
     * @throws Exception the exception
     * @Description: HMAC加密 ：主要方法
     * @author: zhb zhb1316783262@163.com
     * @date: 2018年3月13日 上午11:47:13
     */
    public static String encryptHMAC(byte[] data, String key) throws Exception {
        SecretKey secretKey = new SecretKeySpec(Base64Util.decode(key).getBytes(), KEY_MAC);
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        mac.init(secretKey);
        return new String(mac.doFinal(data));
    }

    /**
     * Gets the result.
     *
     * @param inputStr the input str
     * @return the result
     */
    public static String getResult(String inputStr) {
        String filePath = "/hmac_key.txt";
        String result = null;
        try {
            byte[] inputData = inputStr.getBytes();
            String macKey = HmacUtil.initMacKey(); /* 产生密钥 */
            /* 将密钥写文件 */
            FileUtils.writeToFile(filePath, macKey);
            result = HmacUtil.encryptHMAC(inputData, macKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}